"""
    2021-08-10  16:05   by  CYL
    文件名：
        ListTools.py
    文件用途：
        存放一些在项目中经常反复使用的List的处理函数，为通用型。
    包含函数简要说明：
        1)MERGE_1DList(need_MERGE_1DList)       用途：消除1维列表中的重复元素，并返回新的1维列表。
        2)chg2DList_to_1DList(need_chg_2DList)  用途：将一个2维列表降为1维列表。
        3)chgBlank_in_1DStrList(need_chg_1DStrList,chgBlank_to="",command="drop") 用途：将1维字符串列表中的""成员舍弃。
        4)find_ENG_Str_in_1DStrList(need_find_1DStrList)    用途：过滤1维字符串列表中的成员内容，使所有成员仅剩英文字符。
    缺陷：
        对传入参数未进行判断和验证。
        类型判断可以使用type之类的。
"""
import re
def MERGE_1DList(need_MERGE_1DList:list)->list:
    """
        2021-08-10  15:45   by  CYL
        历史：
            拆分自Hampback-ERP-demo0-PROJ的MERGE_List()函数。
        函数名：
            MERGE_1DList()
        函数说明：
            用于将一个1维列表中的重复元素进行合并后，返回一个没有重复元素的列表。
        传入参数：
            一个内部有重复元素的1维列表，即形如['a','a','b','a']的列表。
        返回值：
            一个新的1维列表，不含有重复元素。
        注意：
            并不会过滤掉' '元素。
            若想过滤掉单独的' '元素，可以使用chgBlank_in_1DStrList()，注意该函数的command参数，默认不舍弃空内容，若要舍弃，需传入drop。
    :param need_MERGE_1DList:
    :return:
    """
    Final_Merged_Result = sorted(set(need_MERGE_1DList),key=need_MERGE_1DList.index)
    print("Final_Merged_Result = ",Final_Merged_Result,"aim:不可关闭，用于监测合并重复值后的列表。")   #此注解不可关闭，用于检测未知情况。
    print("len of Final_Merged_Result = ",len(Final_Merged_Result),"aim:用于显示合并重复值后列表的长度。")
    return Final_Merged_Result

def chg2DList_to_1DList(need_chg_2DList:list)->list:
    """
        2021-08-10  15:55   by  CYL
        历史：
            拆分自Hampback-ERP-demo0-PROJ的MERGE_List()函数。
        函数名：
            chg2DList_to_1DList()
        函数说明：
            用于将一个2维列表降为1维列表后，输出该1维列表。
        传入参数：
            一个有1层嵌套的2维列表，即形如[['x','c'],['a','b'],['b']]的列表。
        返回值：
            一个1维列表。
        注意：
            最后生成的1维列表内部可能会存在重复值，若不想要重复值，则只需在此之后调用MERGE_1DList()即可。
    :param need_chg_2DList:
    :return:
    """
    Final_Changed_1DList = [0]
    for outerClass_in_2DList in range(0,len(need_chg_2DList)):
        for innerClass_in_2DList in range(0,len(need_chg_2DList[outerClass_in_2DList])):
            Final_Changed_1DList.append(need_chg_2DList[outerClass_in_2DList][innerClass_in_2DList])
    Final_Changed_1DList.pop(0)
    print("Final_Changed_1DList = ",Final_Changed_1DList,"aim:用于显示2D->1D后的列表结果。")
    return Final_Changed_1DList

def chgBlank_in_1DStrList(need_chg_1DStrList:list,chgBlank_to:str="",command:str=None)->list:
    """
        2021-08-10  17:47   by  CYL
        历史：
            无。
        函数名：
            chgBlank_in_1DStrList()
        函数说明：
            将一个1维字符串成员列表中的成员中的空白字符用chgBlank_to代替，
            默认空白字符使用无内容代替，默认最终结果不舍弃无内容成员。
            若启用command="drop"，则最终结果会舍弃无内容的成员。
        传入参数：
            1)need_chg_1DStrList，类型：1维列表，成员均为Str字符串型。
            2)chgBlank_to，类型：Str字符串型，即成员中空白字符需要替换成为的东西，默认将空白字符替换为无内容。
            3)command，类型：Str字符串型，当为"drop"时，将会舍弃无内容的成员，默认不舍弃无内容的成员。
        返回值：
            Final_Changed_1DStrlist 类型：1维字符串成员列表。
        测试方式：
            chgBlank_in_1DStrList(["",'a','  ','b','','a','    ',""],command='drop')
    :param need_chg_1DStrList:
    :param chgBlank_to:
    :param command:
    :return:
    """
    Final_Changed_1DStrlist = [0]
    item_in_Final_Changed_1Dlist = None                         #   用于处理need_chg_1DStrList列表中的成员内容，即一个临时中转副本，最后将修改完毕的值保存在Final_Changed_1DStrlist列表的成员中。
    for item in range(0,len(need_chg_1DStrList)):
        item_in_Final_Changed_1Dlist = need_chg_1DStrList[item].replace(" ",chgBlank_to)
        Final_Changed_1DStrlist.append(item_in_Final_Changed_1Dlist)
    Final_Changed_1DStrlist.pop(0)                              #   初步整理Final_Changed_1DStrlist列表完毕。

    if command == None:
        pass
    elif command == 'drop':                                     #   若需要舍弃""成员，则将进一步处理Final_Changed_1DStrlist列表，如下。
        None_item_List = [0]
        for item in range(0,len(Final_Changed_1DStrlist)):      #   查找""的成员在Final_Changed_1DStrlist中的位置，并将该位置代表的index存入None_item_List列表中。
            if Final_Changed_1DStrlist[item] == "":
                None_item_List.append(item)
        None_item_List.pop(0)
        print("None_item_List = ",None_item_List,"aim:用于显示空元素在传入参数need_chg_1DStrList中的位置。")
        for item in range(0,len(None_item_List)):               #   删除Final_Changed_1DStrlist列表中""的成员。
            Final_Changed_1DStrlist.pop(None_item_List[item])
            try :
                for nogori in range(item+1,len(None_item_List)):
                    None_item_List[nogori] = None_item_List[nogori] - 1
                    # print("None_item_List = ",None_item_List,"aim:test")
            except IndexError:                                  #   当发生异常时，即意味着list_index已经到了最后的成员。
                pass
    print("Final_Changed_1Dlist = ",Final_Changed_1DStrlist,"aim:用于显示chgBlank_in_1DStrList()最后的结果。")
    return Final_Changed_1DStrlist

def find_ENG_Str_in_1DStrList(need_find_1DStrList:list)->list:
    """
        2021-08-11  11:07   by  CYL
        历史：
            来源于自建的ListTools_For_HMBK.py。
        函数名：
            find_ENG_Str_in_1DStrList()
        函数说明：
            将一个1维的字符串列表中的成员中的英文字符单独提取出来，再生成一个列表。
            即用于过滤原列表中的除了英文字符串的内容。
        传入参数：
            need_find_1DStrList，类型：一个列表，成员为字符串。
        返回值：
            一个新的列表。
        关联库：
            需要载入re库。
    :param need_find_1DStrList:
    :return:
    """
    output_ENG_Str_1DStrList = [0]
    ENG_Str_pttn = "[a-zA-Z]*"
    member_in_1DStrList = None
    print("need_find_1DStrList = ",need_find_1DStrList,"aim:用于显示传入find_ENG_Str_in_1DStrList()的数值。")
    for index in range(0,len(need_find_1DStrList)):
        member_in_1DStrList = re.findall(ENG_Str_pttn,need_find_1DStrList[index])[0]    #[Attention!]这里是直接选用了第一个元素，需要改进。
        print(f"{index} member_in_1DStrList = ",member_in_1DStrList,"aim:用于显示每次re后ENG_Str的内容。")
        output_ENG_Str_1DStrList.append(member_in_1DStrList)
    output_ENG_Str_1DStrList.pop(0)
    print("output_ENG_Str_1DStrList = ",output_ENG_Str_1DStrList,"aim:用于显示剔除除了英文字符外的列表。")
    return output_ENG_Str_1DStrList

